import {
  ArgumentMetadata,
  BadRequestException,
  ValidationPipe,
} from '@nestjs/common';
import { rmNilValues } from 'src/utils/rmNilValues';

// 配合 DTO 验证处理数据
export class VerifyPipe extends ValidationPipe {
  constructor() {
    super({
      transform: true, // 自动将有效负载转换为根据其 DTO 类类型化的对象
      transformOptions: { enableImplicitConversion: true },
      whitelist: true, // 验证器删除已验证（返回）对象的任何不使用验证装饰器的属性
      forbidNonWhitelisted: true, // 禁止额外字段
      exceptionFactory: (errors) => {
        // 自定义错误结构
        let errorField = '';
        errors.forEach((error) => {
          errorField += error.property + ' ';
        });
        throw new BadRequestException(errorField + '参数错误');
      },
    });
  }

  async transform(value: any, metadata: ArgumentMetadata): Promise<any> {
    // 不对 param 参数进行处理校验
    if (metadata.type === 'param' || metadata.type === 'query') {
      return value;
    }
    try {
      const transformedValue = await super.transform(value, metadata);
      // 去除 null 、 undefined
      return rmNilValues(transformedValue);
    } catch (error) {
      throw error;
    }
  }
}
